/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pagrafo.controle;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import pagrafo.arquivo.Arquivo;
import pagrafo.genetico.AlgoritmoGenetico;
import pagrafo.genetico.Cromossomo;
import pagrafo.genetico.Populacao;
import pagrafo.genetico.Roteamento;
import pagrafo.grafo.Grafo;
import pagrafo.janela.JanelaDeDesenho;
import pagrafo.util.Vetor;

/**
 * Classe responsável por fazer a passagem dos dados entre classes e controlar a execução do programa
 * @author Fabricio
 */
public class Controle {
    
    private Grafo g;
    private JanelaDeDesenho j;
    private AlgoritmoGenetico ag;
    private Cromossomo r;
    private Thread t;
    
    private int k;
    private int p;
    private double capacidade;
    
    private boolean arquivoLido = false;
    private boolean executando = false;
    private boolean terminado = false;
    
    public Controle(){
        //g = new Grafo(); //para teste
        //ag = new AlgoritmoGenetico(g);
        j = new JanelaDeDesenho(this);
        j.setVisible(true);
    }
    
    public void lerArquivo(String local) throws FileNotFoundException, IOException{
        Arquivo a = new Arquivo(local);
        g = a.getG();
        capacidade = a.getCapacidade();
        arquivoLido = true;
        j.setCapacidade(capacidade);
    }
    
    public void executar(int k, int populacao, int geracoes){
       
        if(arquivoLido){
            this.k = k;
            this.p = populacao;      
            
            ArrayList<Cromossomo> solucoesLocais = new ArrayList<Cromossomo>();
        
            for (int i = 0; i < 100; i++){
                System.out.println("Execução do AG: " + (i+1));
                ag = new AlgoritmoGenetico(g, k, capacidade, p, geracoes); 
                ag.executar();
                solucoesLocais.add(ag.getCromossomos().get(0));
            }

            Collections.sort(solucoesLocais);

            System.out.println("###################################################");
            System.out.println("                 SOLUÇÕES LOCAIS");
            System.out.println("###################################################");
            Populacao.imprimePopulacao(solucoesLocais);
            System.out.println("###################################################");

            ag = new AlgoritmoGenetico(g, k, capacidade, p*2, 1000, solucoesLocais);
            ag.executar();
            System.out.println("###################################################");
            System.out.println("                 SOLUÇÕES GLOBAIS");
            System.out.println("###################################################");
            Populacao.imprimePopulacao(ag.getCromossomos());
            
            this.r = ag.getCromossomos().get(0);
            this.terminado = true;
            j.repaint();
        }
    }
    
    //TODO Metodos de controle

    public int[] getRoteamento() {
        return r.v;
    }
    
    public static void main(String[] args){
        Controle c = new Controle();
    }

    public void setGrafo(Grafo g) {
        this.g = g;
    }

    public Grafo getGrafo() {
        return g;
    }
    
    public void terminado(){
        this.terminado = true;
    }

    public boolean isArquivoLido() {
        return arquivoLido;
    }

    public boolean isExecutando() {
        return executando;
    }

    public boolean isTerminado() {
        return terminado;
    }
    
    
    
    
    
}
